package br.com.massai.view.utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import br.com.massai.model.exceptions.ErrorCore;
import br.com.massai.model.exceptions.SystemException;

public class EncryptionUtil {

	private EncryptionUtil() {
	}

	public static final String ALGORITMO_MD2 = "MD2";
	public static final String ALGORITMO_MD5 = "MD5";
	public static final String ALGORITMO_SHA_1 = "SHA-1";
	public static final String ALGORITMO_SHA_256 = "SHA-256";
	public static final String ALGORITMO_SHA_384 = "SHA-384";

	/**
	 * Criptografa a senha no algoritmo informado. Alguns algoritmos suportados
	 * estão definidos com constantes nessa classe. ALGORITMO_MD2 ALGORITMO_MD5
	 * ALGORITMO_SHA_1 ALGORITMO_SHA_256 ALGORITMO_SHA_384
	 * 
	 * @param senha
	 *            Uma String com a senha a ser criptografada.
	 * @param algoritmo
	 *            O algoritmo de criptografia.
	 * @return a senha criptografada no algoritmo informado.
	 * @throws SystemException
	 *             Caso o algoritmo de criptografia não seja encontrado.
	 */
	public static String criptografar(String senha, String algoritmo)
			throws SystemException {

		String senhaCriptografada = null;

		try {

			MessageDigest md = MessageDigest.getInstance(algoritmo);
			byte[] bytes = senha.getBytes();
			byte[] digest = md.digest(bytes);

			senhaCriptografada = toHexString(digest);

		} catch (NoSuchAlgorithmException ns) {
			throw new SystemException(ErrorCore.ERROR_SYSTEM);
		}

		return senhaCriptografada;
	}

	/**
	 * Converte o array de bytes em uma String hexadecimal.
	 * 
	 * @param b
	 *            Array de bytes.
	 * @return Uma String com o conteúdo em hexadecimal.
	 */
	private static String toHexString(byte b[]) {

		StringBuffer sb = new StringBuffer(2 * b.length);

		for (int i = 0; i < b.length; i++) {
			int h = (b[i] & 0xf0) >> 4;
			int l = (b[i] & 0x0f);
			sb.append((char) ((h > 9) ? 'a' + h - 10 : '0' + h));
			sb.append((char) ((l > 9) ? 'a' + l - 10 : '0' + l));
		}

		return sb.toString();

	}

}
